[AWS IoT Greengrass V2] トークン交換サービスでコンポーネントからDynamoDBにアクセスしてみました
1 はじめに
IoT事業部の平内(SIN)です。
AWS IoT Greengrass V2では、AWSから提供されるいくつかの事前構築済みコンポーネントがありますが、その中のトークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) を使用すると、ロールエリアス経由で指定されたロールに基づき、AWSのリソースへのアクセスが可能になります。
今回作成したサンプルのコンポーネントは、起動時にDynamoDBに現在時間を書き込みます。 下記は、それを実行して動作確認している様子です。
左上は、ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)の画面、右上はDynamoDBのコンソール、下は、作成したコンポーネントのログをtailしている画面です。
ローカルデバッグコンソールでコンポネントを再起動するために、DynamoDBのデータが増えていっている様子が確認できます。
2 コンポーネントのコード
作成したコンポーネントのコードは、以下のとおりです。
起動時にDynamoDBに現在時間を追加していますが、ロールにアクセス権が付与されたLambdaのコードのように、特に権限を気にすることなく、boto3.resource() で生成したオブジェクトでそのままアクセスできています。
token_exchange_sample.py
import boto3 import datetime timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('TokenExchangeSampleDb') response = table.put_item( Item = { 'timestamp': timestamp } ) print(response)
3 レシピ
レシピでは、ComponentDependenciesで、aws.greengrass.TokenExchangeServiceの依存関係が定義されています。
--- RecipeFormatVersion: "2020-01-25" ComponentName: "com.example.TokenExchangeSample" ComponentVersion: "1.1.0" ComponentType: "aws.greengrass.generic" ComponentDependencies: aws.greengrass.TokenExchangeService: VersionRequirement: ">=2.0.0 <3.0.0" DependencyType: "HARD" Manifests: - Platform: os: "linux" Name: "Linux" Lifecycle: Install: "pip3 install --user boto3" Run: "python3 {artifacts:path}/token_exchange_sample.py" Artifacts: - Uri: "s3://gg-artifacts-2021-08-11/artifacts/com.example.TokenExchangeSample/1.0.0/token_exchange_sample.py" Digest: "q95KhB1LWZLifeYzkM7NSyy+6tU76N2T960kmBwRj1Y=" Algorithm: "SHA-256" Unarchive: "NONE" Permission: Read: "OWNER" Execute: "NONE" Lifecycle: {}
デプロイが完了すると、作成したコンポーネント(com.example.TokenExchangeSample)とトークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) が確認できます。
$ sudo /greengrass/v2/bin/greengrass-cli component list ・・・略・・・ Component Name: aws.greengrass.TokenExchangeService Version: 0.0.0 State: RUNNING Configuration: {"port":0.0} Component Name: com.example.TokenExchangeSample Version: 1.1.0 State: FINISHED Configuration: {} ・・・略・・・
4 パーミッション
DynamoDBへデータを追加する権限は、下記のロールをGreengrassV2TokenExchangeRoleに追加することで付与されています。
TokenExchangeSampleRole
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:PutItem" ], "Resource": "arn:aws:dynamodb:ap-northeast-1:*:table/TokenExchangeSampleDb" } ] }
5 最後に
今回は、トークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) を使用して、コンポーネントからAWSのリソースへアクセスしてみました。
内部で使われてるのは、Authorizing Direct Callsですが、コンポーネントの実装では、STSの処理などは一切必要ないので、非常に簡単に利用できます。
参考:[AWS IoT] 既存の証明書だけでMQTT以外の各種AWSリソ−スにアクセスする (Authorizing Direct Calls)
6 参考リンク
[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました
[AWS IoT Greengrass V2] コンポーネントでコアデバイス間のPublish/Subscribeを試してみました
[AWS IoT Greengrass V2] ログマネージャでコンポーネントのログをCloudWatch Logsに送ってみました